package main

import "fmt"

/**
用信道的方法来填充斐波那契数列，思路如下：
假设要填充一个有10个数的斐波那契数列
1、先初始化一个信道，它有10个缓冲值
2、循环10次，每次将计算出来的值，压入信道
3、遍历这个信道，将它的每个值打印出来
**/

//这个函数，它接收一个信道作为参数。这个函数做的事情，就是不断往信道的缓冲区压入数据。这里压入的数据是斐波那契数列
func fibonacci(mychan chan int) {
	n := cap(mychan) //n=10
	x, y := 1, 1     //斐波那契数列的前两位数，固定是1
	for i := 0; i < n; i++ {
		//将x的数据，发送到信道中
		mychan <- x
		//即x=y; y=x+y;
		x, y = y, x+y
	}
	// 记得 close 信道
	// 不然主函数中遍历完并不会结束，而是会阻塞。
	close(mychan)
}

func main() {
	pipline := make(chan int, 10)

	go fibonacci(pipline)

	//遍历这个信道。在遍历时，要保证信道是关闭的，否则会阻塞
	//遍历信道，就是读取它里面缓冲的每一个数据
	for k := range pipline {
		fmt.Println(k)
	}

	/**
	为什么这里没有加休眠，确能保证执行协程完成？
	因为在遍历时，会阻塞，直到遇到关闭信道。那什么时候关闭信道呢——当数列填充完了后
	**/
	fmt.Println("main 结束")
}
